home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / DEMO_VGA / DEMOCGA.LZH / MAZE.BAS < prev    next >
BASIC Source File  |  1985-12-24  |  7KB  |  231 lines

  1. 10 REM     This program will generate a maze on the screen of an IBM
  2. 20 REM compatible PC.  A different random number seed will produce a
  3. 30 REM different maze.
  4. 40 REM
  5. 50 REM     Written by James L. Dean
  6. 60 REM                406 40th Street
  7. 70 REM                New Orleans, LA 70124
  8. 80 REM                December 22, 1985
  9. 90 REM
  10. 100 KEY OFF
  11. 110 CLS
  12. 120 RANDOMIZE TIMER
  13. 130 NUM.COLUMNS%=79
  14. 140 NUM.ROWS%=49
  15. 150 REM DIM PATH%(NUM.COLUMNS%,NUM.ROWS%)
  16. 160 DIM PATH%(79,49)
  17. 170 DIM DELTA%(21,2)
  18. 180 DIM MAGNITUDE%(2)
  19. 190 MAGNITUDE%(1)=(319\NUM.COLUMNS%)\2
  20. 200 MAGNITUDE%(2)=(199\NUM.ROWS%)\2
  21. 210 X.MAX%=2*MAGNITUDE%(1)*NUM.COLUMNS%
  22. 220 Y.MAX%=2*MAGNITUDE%(2)*NUM.ROWS%
  23. 230 FOR DELTA.INDEX.1%=1 TO 10
  24. 240   DELTA%(DELTA.INDEX.1%,1)=1
  25. 250   DELTA%(DELTA.INDEX.1%,2)=0
  26. 260 NEXT DELTA.INDEX.1%
  27. 270 FOR DELTA.INDEX.1%=11 TO 17
  28. 280   DELTA%(DELTA.INDEX.1%,1)=0
  29. 290   DELTA%(DELTA.INDEX.1%,2)=1
  30. 300 NEXT DELTA.INDEX.1%
  31. 310 FOR DELTA.INDEX.1%=18 TO 19
  32. 320   DELTA%(DELTA.INDEX.1%,1)=-1
  33. 330   DELTA%(DELTA.INDEX.1%,2)=0
  34. 340 NEXT DELTA.INDEX.1%
  35. 350 FOR DELTA.INDEX.1%=20 TO 21
  36. 360   DELTA%(DELTA.INDEX.1%,1)=0
  37. 370   DELTA%(DELTA.INDEX.1%,2)=-1
  38. 380 NEXT DELTA.INDEX.1%
  39. 390 DIM COORD%(2),NEW.COORD%(2)
  40. 400 SCREEN 1
  41. 405 COLOR 0,4
  42. 410 CLS
  43. 420 X%=0
  44. 430 WHILE (X% <= X.MAX%)
  45. 440   LINE (X%,0)-(X%,Y.MAX%),3
  46. 450   X%=X%+2*MAGNITUDE%(1)
  47. 460 WEND
  48. 470 Y%=0
  49. 480 WHILE (Y% <= Y.MAX%)
  50. 490   LINE (0,Y%)-(X.MAX%,Y%),3
  51. 500   Y%=Y%+2*MAGNITUDE%(2)
  52. 510 WEND
  53. 520 FOR COLUMN%=1 TO NUM.COLUMNS%
  54. 530   FOR ROW%=1 TO NUM.ROWS%
  55. 540     PATH%(COLUMN%,ROW%)=0
  56. 550   NEXT ROW%
  57. 560 NEXT COLUMN%
  58. 570 COORD%(1)=1
  59. 580 COORD%(2)=1
  60. 590 NUM.PATHS%=1
  61. 600 PATH%(1,1)=NUM.PATHS%
  62. 610 GOTO 830
  63. 620 DEAD.END%=0
  64. 630 FOR DELTA.INDEX.1%=1 TO 21
  65. 640   DELTA.INDEX.2%=1+INT(21!*RND)
  66. 650   FOR DIM.NUM%=1 TO 2
  67. 660     TEM.INT%=DELTA%(DELTA.INDEX.1%,DIM.NUM%)
  68. 670     DELTA%(DELTA.INDEX.1%,DIM.NUM%)=DELTA%(DELTA.INDEX.2%,DIM.NUM%)
  69. 680     DELTA%(DELTA.INDEX.2%,DIM.NUM%)=TEM.INT%
  70. 690   NEXT DIM.NUM%
  71. 700 NEXT DELTA.INDEX.1%
  72. 710 FOR DELTA.INDEX.1%=1 TO 21
  73. 720   FOR DIM.NUM%=1 TO 2
  74. 730     NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
  75. 740   NEXT DIM.NUM%
  76. 750   IF NEW.COORD%(1) < 1 THEN 800
  77. 760   IF NEW.COORD%(1) > NUM.COLUMNS% THEN 800
  78. 770   IF NEW.COORD%(2) < 1 THEN 800
  79. 780   IF NEW.COORD%(2) > NUM.ROWS% THEN 800
  80. 790   IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) = 0 THEN 820
  81. 800 NEXT DELTA.INDEX.1%
  82. 810 DEAD.END%=1
  83. 820 RETURN
  84. 830 GOSUB 620
  85. 840 IF DEAD.END% <> 0 THEN 410
  86. 850 GOSUB 1770
  87. 860 PATH%(COORD%(1),COORD%(2))=NUM.PATHS%
  88. 870 IF COORD%(1) <> NUM.COLUMNS% THEN 830
  89. 880 IF COORD%(2) <> NUM.ROWS% THEN 830
  90. 890 FOR DELTA.INDEX.1%=1 TO 10
  91. 900   DELTA%(DELTA.INDEX.1%,1)=-1
  92. 910   DELTA%(DELTA.INDEX.1%,2)=0
  93. 920 NEXT DELTA.INDEX.1%
  94. 930 FOR DELTA.INDEX.1%=11 TO 17
  95. 940   DELTA%(DELTA.INDEX.1%,1)=0
  96. 950   DELTA%(DELTA.INDEX.1%,2)=-1
  97. 960 NEXT DELTA.INDEX.1%
  98. 970 FOR DELTA.INDEX.1%=18 TO 19
  99. 980   DELTA%(DELTA.INDEX.1%,1)=1
  100. 990   DELTA%(DELTA.INDEX.1%,2)=0
  101. 1000 NEXT DELTA.INDEX.1%
  102. 1010 FOR DELTA.INDEX.1%=20 TO 21
  103. 1020   DELTA%(DELTA.INDEX.1%,1)=0
  104. 1030   DELTA%(DELTA.INDEX.1%,2)=1
  105. 1040 NEXT DELTA.INDEX.1%
  106. 1050 FOR COLUMN%=NUM.COLUMNS% TO 1 STEP -1
  107. 1060   STARTING.ROW%=1
  108. 1070   WHILE (STARTING.ROW% <= NUM.ROWS%)
  109. 1080     IF PATH%(COLUMN%,STARTING.ROW%) = 1 THEN 1110
  110. 1090     STARTING.ROW%=STARTING.ROW%+1
  111. 1100   WEND
  112. 1110   ROW%=STARTING.ROW%
  113. 1120   WHILE (ROW% < NUM.ROWS%)
  114. 1130     ROW%=ROW%+1
  115. 1140     IF PATH%(COLUMN%,ROW%) = 0 THEN GOSUB 1460
  116. 1150   WEND
  117. 1160 NEXT COLUMN%
  118. 1170 FOR DELTA.INDEX.1%=1 TO 10
  119. 1180   DELTA%(DELTA.INDEX.1%,1)=1
  120. 1190   DELTA%(DELTA.INDEX.1%,2)=0
  121. 1200 NEXT DELTA.INDEX.1%
  122. 1210 FOR DELTA.INDEX.1%=11 TO 17
  123. 1220   DELTA%(DELTA.INDEX.1%,1)=0
  124. 1230   DELTA%(DELTA.INDEX.1%,2)=1
  125. 1240 NEXT DELTA.INDEX.1%
  126. 1250 FOR DELTA.INDEX.1%=18 TO 19
  127. 1260   DELTA%(DELTA.INDEX.1%,1)=-1
  128. 1270   DELTA%(DELTA.INDEX.1%,2)=0
  129. 1280 NEXT DELTA.INDEX.1%
  130. 1290 FOR DELTA.INDEX.1%=20 TO 21
  131. 1300   DELTA%(DELTA.INDEX.1%,1)=0
  132. 1310   DELTA%(DELTA.INDEX.1%,2)=-1
  133. 1320 NEXT DELTA.INDEX.1%
  134. 1330 FOR COLUMN%=1 TO NUM.COLUMNS%
  135. 1340   STARTING.ROW%=1
  136. 1350   WHILE (STARTING.ROW% <= NUM.ROWS%)
  137. 1360     IF PATH%(COLUMN%,STARTING.ROW%) = 1 THEN 1390
  138. 1370     STARTING.ROW%=STARTING.ROW%+1
  139. 1380   WEND
  140. 1390   ROW%=STARTING.ROW%
  141. 1400   WHILE (ROW% > 1)
  142. 1410     ROW%=ROW%-1
  143. 1420     IF PATH%(COLUMN%,ROW%) = 0 THEN GOSUB 1460 
  144. 1430   WEND
  145. 1440 NEXT COLUMN% 
  146. 1450 GOTO 1880
  147. 1460 COORD%(1)=COLUMN%
  148. 1470 COORD%(2)=ROW%
  149. 1480 NUM.PATHS%=NUM.PATHS%+1
  150. 1490 PATH%(COORD%(1),COORD%(2))=NUM.PATHS%
  151. 1500 GOSUB 620
  152. 1510 IF DEAD.END% <> 0 THEN 1540
  153. 1520 GOSUB 1770
  154. 1530 GOTO 1490
  155. 1540 FOR DELTA.INDEX.1%=1 TO 21
  156. 1550   FOR DIM.NUM%=1 TO 2
  157. 1560     NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
  158. 1570   NEXT DIM.NUM%
  159. 1580   IF NEW.COORD%(1) < 1 THEN 1630
  160. 1590   IF NEW.COORD%(1) > NUM.COLUMNS% THEN 1630
  161. 1600   IF NEW.COORD%(2) < 1 THEN 1630
  162. 1610   IF NEW.COORD%(2) > NUM.ROWS% THEN 1630
  163. 1620   IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) = 1 THEN 1750
  164. 1630 NEXT DELTA.INDEX.1%
  165. 1640 FOR DELTA.INDEX.1%=1 TO 21
  166. 1650   FOR DIM.NUM%=1 TO 2
  167. 1660     NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
  168. 1670   NEXT DIM.NUM%
  169. 1680   IF NEW.COORD%(1) < 1 THEN 1730
  170. 1690   IF NEW.COORD%(1) > NUM.COLUMNS% THEN 1730
  171. 1700   IF NEW.COORD%(2) < 1 THEN 1730
  172. 1710   IF NEW.COORD%(2) > NUM.ROWS% THEN 1730
  173. 1720   IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) <> NUM.PATHS% THEN 1750
  174. 1730 NEXT DELTA.INDEX.1%
  175. 1740 GOTO 1760
  176. 1750 GOSUB 1770
  177. 1760 RETURN
  178. 1770 IF COORD%(1) = NEW.COORD%(1) THEN 1830
  179. 1780   X%=(COORD%(1)+NEW.COORD%(1)-1)*MAGNITUDE%(1)
  180. 1790   Y%=(2*COORD%(2)-1)*MAGNITUDE%(2)
  181. 1800   LINE (X%,Y%-MAGNITUDE%(2)+1)-(X%,Y%+MAGNITUDE%(2)-1),0 
  182. 1810   COORD%(1)=NEW.COORD%(1)
  183. 1820 GOTO 1870
  184. 1830   X%=(2*COORD%(1)-1)*MAGNITUDE%(1)
  185. 1840   Y%=(COORD%(2)+NEW.COORD%(2)-1)*MAGNITUDE%(2)
  186. 1850   LINE (X%-MAGNITUDE%(1)+1,Y%)-(X%+MAGNITUDE%(1)-1,Y%),0
  187. 1860   COORD%(2)=NEW.COORD%(2) 
  188. 1870 RETURN
  189. 1880 PAINT (MAGNITUDE%(1),MAGNITUDE%(2)),2,3
  190. 1890 X.LOW%=MAGNITUDE%(1)
  191. 1900 X.HIGH%=X.MAX%-X.LOW%
  192. 1910 X.STEP%=2*X.LOW%
  193. 1920 Y.LOW%=MAGNITUDE%(2)
  194. 1930 Y.HIGH%=Y.MAX%-Y.LOW%
  195. 1940 Y.STEP%=2*Y.LOW%
  196. 1950 FOR X%=X.LOW% TO X.HIGH% STEP X.STEP%
  197. 1960   Y%=Y.LOW%
  198. 1970   WHILE (POINT(X%,Y%) = 0)
  199. 1980     Y%=Y%+Y.STEP%
  200. 1990   WEND
  201. 2000   WHILE (Y% > Y.LOW%)
  202. 2010     Y%=Y%-Y.STEP%
  203. 2020     IF POINT(X%,Y%) <> 0 THEN 2060
  204. 2030       PAINT (X%,Y%),2,3
  205. 2040       Y.OUT%=Y%+MAGNITUDE%(2)
  206. 2050       LINE (X%-MAGNITUDE%(1)+1,Y.OUT%)-(X%+MAGNITUDE%(1)-1,Y.OUT%),2
  207. 2060   WEND
  208. 2070 NEXT X%
  209. 2080 FOR X%=X.HIGH% TO X.LOW% STEP -X.STEP%
  210. 2090   Y%=Y.LOW%
  211. 2100   WHILE (POINT(X%,Y%) = 0)
  212. 2110     Y%=Y%+Y.STEP%
  213. 2120   WEND
  214. 2130   WHILE (Y% < Y.HIGH%)
  215. 2140     Y%=Y%+Y.STEP%
  216. 2150     IF POINT(X%,Y%) <> 0 THEN 2190
  217. 2160       PAINT (X%,Y%),2,3
  218. 2170       Y.OUT%=Y%-MAGNITUDE%(2)
  219. 2180       LINE (X%-MAGNITUDE%(1)+1,Y.OUT%)-(X%+MAGNITUDE%(1)-1,Y.OUT%),2
  220. 2190   WEND
  221. 2200 NEXT X%
  222. 2210 PAINT (MAGNITUDE%(1),MAGNITUDE%(2)),0,3
  223. 2220 LINE (1,Y.MAX%)-(2*MAGNITUDE%(1)-1,Y.MAX%),0
  224. 2230 LINE (X.MAX%-2*MAGNITUDE%(1)+1,0)-(X.MAX%-1,0),0
  225. 2240 SOUND 400,18
  226. 2250 I$=INKEY$
  227. 2260 IF LEN(I$) = 0 THEN 2250
  228. 2270 SCREEN 0
  229. 2280 WIDTH 80
  230. 2290 END
  231.